#ifndef NETCORE_H
#define NETCORE_H


// **
//
// 网络核心类
//   该类用于封装网络通讯的所有功能
//
// created by yiyefangzhou24
// created time 2024/1/5
//
// **

#include <QObject>
#include <QList>
#include <QtNetwork>
#include "mytcpsocket.h"
#include "config.h"


#define ERR_FORMAT         0x000010
#define ERR_NET_PORT       0x000011
#define ERR_NET_ACCEPT     0x000012
#define ERR_NET_SOCKET     0x000013

#define CLI_NEW            0x000020
#define CLI_UPDATE         0x000021
#define CLI_DEL            0x000022


class NetCore: public QObject
{
    Q_OBJECT

public:

    NetCore();
    ~NetCore();

    // 配置信息
    void config(int port);

    // 开启网络核心服务
    void start();

    // 关闭网络核心服务
    void stop();

    // 功能函数 - 发送屏幕参数
    void scConfigRequest(MyTcpSocket * myTcpSocket, Config * config);

    // 功能函数 - 发送计算延时请求
    void delayRequest(MyTcpSocket * myTcpSocket);

    // 功能函数 - 发送开始、停止抓屏数据流信号
    void scSigRequest(MyTcpSocket * myTcpSocket, int code);

    // 功能函数 - 根据描述符查找客户端信息
    MyTcpSocket * findTcpSocket(int descriptor);

private slots:

    // 槽函数 - 连接槽函数
    void on_tcp_connect();

    // 槽函数 - 接收消息槽函数
    void on_tcp_read();

    // 槽函数 - 断开连接槽函数
    void on_tcp_disconnect();

    // 槽函数 - 网络监听Accept错误
    void on_tcp_accept_error(QAbstractSocket::SocketError socketError);

    // 槽函数 - 收到完整数据包
    void on_pkg_ready(QByteArray data, MyTcpSocket* myTcpSocket);

signals:

    // 信号函数 - 返回错误代码和描述信息
    void sigError(int code, QString msg);

    // 信号函数 - 客户端信息变更信号，包括增删改
    void sigClient(int code, MyTcpSocket * myTcpSocket);

    // 信号函数 - 屏幕位图流数据
    void sigScData(MyTcpSocket* tcpSocket, int x, int y, QByteArray data);

private:

    QTcpServer * tcpServer;         // 服务器句柄

    QList<MyTcpSocket *> myTcpSocketList;       // 客户端列表

    int port;                       // 服务器端口

};

#endif // NETCORE_H
